package com.bear.newsset.util;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.IBinder;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.util.TypedValue;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

import java.lang.reflect.Field;
import java.util.Arrays;

/**
 * 系统工具类
 * @see #getScreenWidth(Context)
 * @see #getScreenHeight(Context)
 * @see #getPackgeInfo(Context)
 * @see #hideKeyboard(Context)
 * @see #autoPopUpKeyboard(Context, Dialog, EditText)
 * @see #getDeclaredField(Object, String)
 */
public class SysUtil {

    /**
     * 获取屏幕宽度
     * @param mContext  上下文
     * @return          宽度
     */
    public static int getScreenWidth(Context mContext) {
        return mContext.getResources().getDisplayMetrics().widthPixels;
    }

    /**
     * 获取屏幕高度
     * @param mContext  上下文
     * @return          高度
     */
    public static int getScreenHeight(Context mContext) {
        return mContext.getResources().getDisplayMetrics().heightPixels;
    }


    /**
     * 获取包信息
     * @param mContext  上下文
     * @return          {@link PackageInfo}
     */
    public static @Nullable PackageInfo getPackgeInfo(@NonNull Context mContext) {
        PackageManager pm;
        try {
            pm = mContext.getPackageManager();
            return pm.getPackageInfo(mContext.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            LogUtils.e("Error", "Get Packge Info:" + Arrays.toString(e.getStackTrace()));
        }
        return null;
    }

//    /**
//     * 设置震动
//     * @param mContext  上下文
//     * @param millis    毫秒数
//     */
//    public static void setVibrator(@NonNull Context mContext, long millis) {
//        ((Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(millis);
//    }

    /**
     * 显示软键盘
     * @param view  需要显示的View
     * @param <V>   该View必须继承 {@link View}
     * @return      显示已显示
     */
    public static <V extends View> boolean showKeyboard(@NonNull V view) {
        InputMethodManager imm = getInputMethodManager( view.getContext() );
        return imm != null && imm.showSoftInput(view, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    }

    /**
     * 关闭软键盘
     * @param mContext  上下文
     * @return          是否已关闭
     */
    public static boolean hideKeyboard(@NonNull Context mContext) {
        InputMethodManager imm = getInputMethodManager( mContext );
        View cfView = ((Activity) mContext).getCurrentFocus();
        IBinder ib;
        return imm != null && cfView != null &&
                imm.isActive() && (ib = cfView.getWindowToken()) != null &&
                imm.hideSoftInputFromWindow(ib, InputMethodManager.HIDE_NOT_ALWAYS);
    }

    public static InputMethodManager getInputMethodManager(@NonNull Context mContext) {
        return (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
    }

    /**
     * dialog自动弹出键盘
     * @param mContext  上下文
     * @param d         Dialog
     * @param et        Dialog下的编辑框
     */
    public static void autoPopUpKeyboard(@NonNull Context mContext, Dialog d, EditText et) {
        d.setOnShowListener(dialog -> (
                (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE))
                .showSoftInput(et, InputMethodManager.SHOW_IMPLICIT));
    }

    /**
     * dp转px
     * @param mContext      上下文
     * @param dp            dp值
     * @return 返回的dp
     */
    public static float dp2px(Context mContext, float dp) {
        return TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, dp,
                mContext.getResources().getDisplayMetrics());
    }

    /**
     * 反射
     * @param fun       反射（例如：类）
     * @param name      变量名、方法名
     * @param <T>       传入的反射
     * @return          返回反射的结果
     */
    public static <T> Object getDeclaredField(@NonNull T fun, String name) {
        try {
            Field f = fun.getClass().getDeclaredField(name);
            f.setAccessible( true );
            return f.get( fun );
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}
